import os.path
import shutil
import subprocess

import urllib.request
import urllib3

normal_pre_package = []   # 安装前置包

# 这是安装fastjson的类

class NormalMethod:
    def __init__(self, version, PBMworkdir):
        self.version = version # 1.2.68
        self.softname = 'fastjson-{}'.format(self.version) # fastjson-3.7.0
        self.PBMwork_dir = PBMworkdir   # /tmp/PBMwork/fastjson-1.2.68/


    @staticmethod
    def runcmd(command):    # linux命令通过该函数运行
        print('Notice：执行命令 —— CMD={}'.format(command))
        p = subprocess.Popen(command, shell=True)
        p.wait()
        if p.returncode == 0:
            print('Notice：命令执行成功 —— CMD={}'.format(command))
        else:
            print('!!!!Error：执行失败 —— CMD={}'.format(command))

    def download(self): # 下载源码包
        print('====> 下载python包')
        url = 'https://repo1.maven.org/maven2/com/alibaba/fastjson/{}/{}.jar'.format(self.version, self.softname)
        dest = self.PBMwork_dir + '{}.jar'.format(self.softname)
        print('Notice：正在下载 —— URL={}'.format(url))
        urllib.request.urlretrieve(url, dest)   # 下载Python-3.7.0.tar.xz到/tmp/PBMwork/下
        print('Notice：下载完成 —— PATH={}'.format(dest))

    def pre_install(self):  # 前置：安装需要的环境
        print('====> 安装需要的环境包')
        if normal_pre_package:
            packagelist = ' '.join(normal_pre_package)
            command = 'yum -y install {}'.format(packagelist)
            self.runcmd(command)

    def write_install(self):  # 主安装过程
        print('====> 写入安装脚本')
        normal_text = [
            'yum install java-1.8.0-openjdk java-1.8.0-openjdk-devel -y\n'
            'cp {}.jar /usr/lib/jvm/java-openjdk/lib\n'.format(self.PBMwork_dir + self.softname)
            ]
        f = open(self.PBMwork_dir + 'install.sh', 'a', encoding='utf-8')
        for text in normal_text:
            f.write(text + '\n')
        f.close()
        print('Notice：安装脚本写入完成 —— PATH={}'.format(self.PBMwork_dir + '/install.sh'))
        fd = open('/etc/profile', 'a', encoding='utf-8')
        profile = [
            'export JAVA_HOME=/usr/lib/jvm/java-openjdk\n',
            'export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/{}.jar\n'.format(self.softname),
            'export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH:$HOME/bin\n'
        ]
        fd.writelines(profile)

    def install(self):
        self.download()
        self.pre_install()
        self.write_install()
        print('====> 开始安装')
        self.runcmd('bash {}'.format(self.PBMwork_dir + 'install.sh'))

    def check(self):    # 安装结果查看，判断是否符合要求
        filedir = os.path.dirname(os.path.realpath(__file__))
        shutil.copyfile(filedir + '/User.java', '{}User.java'.format(self.PBMwork_dir))
        shutil.copyfile(filedir + '/FastJsonTest.java', '{}FastJsonTest.java'.format(self.PBMwork_dir))
        self.runcmd('source /etc/profile && javac -d {} {}User.java'.format(self.PBMwork_dir, self.PBMwork_dir))
        self.runcmd('source /etc/profile && cd {} && javac -d {} {}FastJsonTest.java'.format(self.PBMwork_dir, self.PBMwork_dir, self.PBMwork_dir))
        print('====> 验证过程')
        print('请输入下方命令 CMD=\ncd {} && source /etc/profile && java FastJsonTest'.format(self.PBMwork_dir))

    def __call__(self): # 主入口。用来启动测试过程
        print('--------  This is normal_method  --------')
        self.install()
        self.check()
